package com.jie.commonlib.support.arouter;

import android.app.Application;
import android.content.Context;
import android.os.Bundle;

import com.alibaba.android.arouter.facade.Postcard;
import com.alibaba.android.arouter.launcher.ARouter;
import com.jie.commonlib.GlobalConfig;

import androidx.fragment.app.Fragment;

/**
 * @author H.J.
 * @date 2019/11/22 15:41
 * @description ARouter框架管理类
 * 使用静态内部类实现单例
 */
public class ARouterManager {

    private ARouterManager(){
    }

    private static class InstanceHolder{
        private static ARouterManager aRouterManager = new ARouterManager();
    }

    public static ARouterManager getInstance(){
        return InstanceHolder.aRouterManager;
    }

    /**
     * 初始化ARouter框架
     * @param application
     */
    public void init(Application application){
        if (GlobalConfig.isShowLog){
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(application);
    }

    /**
     * 通过ARouter获取一个Fragment对象
     * @param path 定义在ARouterConstant中的常量
     */
    public Fragment getFragment(@ARouterFragment String path){
        return getFragment(path, null);
    }

    /**
     * 通过ARouter获取一个Fragment对象
     * @param path 定义在ARouterConstant中的常量
     */
    public Fragment getFragment(@ARouterFragment String path, Bundle bundle){
        Postcard postcard = getPostcard(path, bundle);
        return (Fragment) postcard.navigation();
    }

    /**
     * 通过ARouter实现应用内的简单跳转（不带参数,使用Application做上下文）
     * @param path 定义在ARouterConstant.ActivityPath中的常量
     */
    public void openActivity(@ARouterActivity String path) {
        ARouter.getInstance().build(path).navigation();
    }

    /**
     * 通过ARouter实现应用内的简单跳转（不带参数）
     * @param context 指定跳转的上下文
     * @param path 定义在ARouterConstant中的常量
     */
    public void openActivity(Context context, @ARouterActivity String path) {
        openActivity(context,path,null);
    }

    /**
     * 通过ARouter实现应用内的跳转，可以传递参数，指定上下文
     * @param context 上下文，不能非空
     * @param path 定义在ARouterConstant.ActivityPath中的常量，不能非空
     * @param bundle 参数集合，可以为空
     */
    public void openActivity(Context context, @ARouterActivity String path, Bundle bundle){
        Postcard postcard = getPostcard(path, bundle);
        postcard.navigation(context);
    }

    /**
     * 根据路径和bundle获取Postcard对象
     * @param path 路径
     * @param bundle 参数，可以为空
     * @return Postcard对象
     */
    private Postcard getPostcard(@ARouterFragment String path, Bundle bundle) {
        Postcard postcard = ARouter.getInstance().build(path);
        if (null != bundle) {
            postcard.with(bundle);
        }
        return postcard;
    }

}
